/* Copyright (C) 2007-2010 STS Soft

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; version 2 of the License.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using STSdb.Data;

namespace STSdb.Plan
{
    public class Resolver<TRecord>
    {
        private Dictionary<ulong, TRecord> reverse;
        private Dictionary<TRecord, ulong> direct;
        private ulong autoID;

        public XTable<ulong, TRecord> Table { get; private set; }

        public Resolver(XTable<ulong, TRecord> table)
        {
            Table = table;

            reverse = new Dictionary<ulong, TRecord>((int)Table.Count);
            direct = new Dictionary<TRecord, ulong>((int)Table.Count);

            autoID = 0;
            foreach (var row in Table)
            {
                reverse.Add(row.Key, row.Record);
                direct.Add(row.Record, row.Key);

                if (row.Key > autoID)
                    autoID = row.Key;
            }
            autoID++;
        }

        public ulong Direct(TRecord record)
        {
            ulong id;
            if (!direct.TryGetValue(record, out id))
            {
                id = autoID;

                reverse.Add(id, record);
                direct.Add(record, id);
                Table[id] = record;

                autoID++;
            }

            return id;
        }

        public TRecord Reverse(ulong id)
        {
            return reverse[id];
        }
    }
}
